package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.PasswordConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.dto.PasswordEditDTO;
import com.sky.entity.Employee;
import com.sky.exception.AccountLockedException;
import com.sky.exception.AccountNotFoundException;
import com.sky.exception.PasswordErrorException;
import com.sky.mapper.EmployeeMapper;
import com.sky.result.PageResult;
import com.sky.service.EmployeeService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.time.LocalDateTime;

@Service
public class EmployeeServiceImpl implements EmployeeService {
	
	@Autowired
	private EmployeeMapper employeeMapper;
	
	/**
	 * 员工登录
	 *
	 * @param employeeLoginDTO
	 * @return
	 */
	@Override
	public Employee login(EmployeeLoginDTO employeeLoginDTO) {
		String username = employeeLoginDTO.getUsername();
		String password = employeeLoginDTO.getPassword();
		
		//1、根据用户名查询数据库中的数据
		Employee employee = employeeMapper.getByUsername(username);
		
		//2、处理各种异常情况（用户名不存在、密码不对、账号被锁定）
		if (employee == null) {
			//账号不存在
			throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
		}
		
		//密码比对 进行md5加密，然后再进行比对
		password = DigestUtils.md5DigestAsHex(password.getBytes());
		if (!password.equals(employee.getPassword())) {
			//密码错误
			throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
		}
		
		if (employee.getStatus().equals(StatusConstant.DISABLE)) {
			//账号被锁定
			throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
		}
		
		//3、返回实体对象
		return employee;
	}
	
	@Override
	public void addEmployee(EmployeeDTO employeeDTO) {
		Employee employee = new Employee();
		// 对象属性拷贝
		BeanUtils.copyProperties(employeeDTO, employee);
		// 设置默认值
		employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
		employee.setStatus(StatusConstant.ENABLE);
		employee.setCreateTime(LocalDateTime.now());
		employee.setUpdateTime(LocalDateTime.now());
		// 创建人id和修改人id
		employee.setCreateUser(BaseContext.getCurrentId());
		employee.setUpdateUser(BaseContext.getCurrentId());
		
		employeeMapper.addEmployee(employee);
	}
	
	/**
	 * 分页获取员工
	 *
	 * @param employeePageQueryDTO
	 * @return
	 */
	@Override
	public PageResult getEmployees(EmployeePageQueryDTO employeePageQueryDTO) {
		// 插件自动计算分页
		PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
		// 获取返回所有信息
		Page<Employee> employees = employeeMapper.getEmployees(employeePageQueryDTO);
		employees.getResult().forEach(e -> e.setPassword("***"));
		return new PageResult(employees.getTotal(), employees.getResult());
	}
	
	
	/**
	 * 禁用/启用员工
	 *
	 * @param id
	 * @param status
	 */
	@Override
	public void disableEmployee(Long id, Integer status) {
//		Employee employee =
//			Employee.builder().id(id).status(status).updateTime(LocalDateTime.now()).updateUser(BaseContext
//			.getCurrentId()
//			).build();
		Employee employee = Employee.builder().id(id).status(status).build();
		
		employeeMapper.putEmployee(employee);
	}
	
	/**
	 * 根据id 获取员工信息
	 *
	 * @param id
	 * @return
	 */
	@Override
	public Employee getEmployeeId(Long id) {
		Employee employee = employeeMapper.getEmployeeId(id);
		employee.setPassword("***");
		return employee;
	}
	
	
	/**
	 * 编辑员工信息
	 *
	 * @param employee
	 */
	@Override
	public void putEmployee(Employee employee) {
//		employee.setUpdateTime(LocalDateTime.now());
//		employee.setUpdateUser(BaseContext.getCurrentId());
		// 修复修改信息时 密码被修改
		employee.setPassword(null);
		employeeMapper.putEmployee(employee);
	}
	
	/**
	 * 修改密码
	 */
	@Override
	public void putPassword(PasswordEditDTO passwordEditDTO) {
		Long id = BaseContext.getCurrentId();
		if (passwordEditDTO.getEmpId() != null) {
			id = passwordEditDTO.getEmpId();
		}
		Employee employee = employeeMapper.getEmployeeId(id);
		if (employee.getPassword().equals(DigestUtils.md5DigestAsHex(passwordEditDTO.getOldPassword().getBytes()))) {
			employeeMapper.putPassword(id,
					DigestUtils.md5DigestAsHex(passwordEditDTO.getNewPassword().getBytes()), LocalDateTime.now());
		} else {
			throw new PasswordErrorException(MessageConstant.ORIGINAL_PASSWORD_FAILED);
		}
	}
}










